﻿using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Caching.Distributed;

namespace AdminBase.Common.Attributes
{
    /// <summary>
    /// 幂等特性
    /// 可以应用于类、方法，不允许重复应用，不继承给派生类
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
    public class IdempotentAttribute : Attribute, IFilterFactory
    {
        /// <summary>
        /// 此过滤器实例是否可重用。对于此实现，返回false，因为每次请求都会创建新的过滤器实例。
        /// </summary>
        public bool IsReusable => false;

        /// <summary>
        /// 初始化过滤器
        /// </summary>
        /// <param name="serviceProvider">服务提供者，用于解析依赖项</param>
        /// <returns></returns>
        public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
        {
            // 从服务提供者中获取IDistributedCache的实例，用于分布式缓存操作。
            var distributedCache = (IDistributedCache)serviceProvider.GetService(typeof(IDistributedCache));

            // 创建IdempotentAttributeFilter的实例，并传入分布式缓存实例
            var filter = new IdempotentAttributeFilter(distributedCache);
            // 返回过滤器实例
            return filter;
        }
    }
}